﻿using System;
using System.Collections.Generic;
using System.Windows.Forms;
namespace TwinHead.Frameworks.WindowForms.KeyActions
{
    /// <summary>
    /// 단축키에 관한 기본적인 구현을 도와줄 수 있는 기능을 제공합니다.
    /// </summary>
    public class KeyActionHelper : IDisposable
    {
        private Dictionary<Keys, IKeyAction> keyActions = new Dictionary<Keys, IKeyAction>();
        /// <summary>
        /// 지정한 key와 연결된 액션 객체를 컬렉션에 추가합니다.
        /// </summary>
        /// <param name="key"></param>
        /// <param name="keyAction"></param>
        public void Add( Keys key, IKeyAction keyAction )
        {
            if (keyAction == null) return;
            keyActions[key] = keyAction;
        }
        /// <summary>
        /// 지정한 key에 할당된 액션객체가 존재합니까?
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public bool HasKeyAction( Keys key )
        {
            return keyActions.ContainsKey( key );
        }
        /// <summary>
        /// 지정한 key에 할당된 액션객체를 반환합니다.
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public IKeyAction Get( Keys key )
        {
            if (!HasKeyAction( key ))
            {
                return new NullKeyAction();
            }
            return (IKeyAction)keyActions[key];
        }
        /// <summary>
        /// 지정한 key에 할당된 액션객체를 반환합니다.
        /// </summary>
        /// <param name="e"></param>
        /// <returns></returns>
        public IKeyAction Get( KeyEventArgs e )
        {
            return Get( e.KeyCode | e.Modifiers );
        }

        #region IDisposable 멤버

        private bool isDisposed;
        /// <summary>
        /// 자원을 해소합니다.
        /// </summary>
        /// <param name="disposing"></param>
        private void Dispose( bool disposing )
        {
            if (isDisposed) return;
            if (disposing)
            {
                // 관리 자원을 해소한다.
                if (keyActions != null && keyActions.Count > 0)
                {
                    keyActions.Clear();
                }
                keyActions = null;
            }
            // 비관리 자원을 해소한다.
            isDisposed = true;
            return;
        }
        /// <summary>
        /// 자원을 해소합니다.
        /// </summary>
        public void Dispose()
        {
            Dispose( true );
            GC.SuppressFinalize( this );
        }

        #endregion
    }
}
